/**
 * Function 实例的 bind() 方法创建一个新函数，当调用该新函数时，它会调用原始函数并将其 this 关键字设置为给定的值，
 * 同时，还可以传入一系列指定的参数，这些参数会插入到调用新函数时传入的参数的前面。
 * @param {*} context 
 * @param  {...any} args 
 */
function myBind(context, ...bindArgs) {
    const origionalFunc = this;
    return function(...callArgs) {
        const combinedArgs = bindArgs.concat(callArgs);

        // 判断是否是new 关键字调用的函数
        if (new.target) {
            return new origionalFunc(...combinedArgs);
        } else {
            return origionalFunc.apply(context, combinedArgs);
        }
    }
}